package com.shenzw.common.utils;

import com.carrotsearch.sizeof.RamUsageEstimator;

import java.util.*;

/**
 * @author shenzw
 * @date 2023/11/1
 */
public class ListSizeSplitUtil {

    /**
     * 最大字节大小
     */
    private static Long maxByteSize;

    /**
     * 100 字节大小
     */
    private static final Long BYTE_SIZE = 100L;

    /**
     * 根据传进来的 byte 大小限制，将 list 分割成对应大小的 list 集合数据
     *
     * @param byteSize 每个 list 数据最大大小
     * @param list     待分割集合
     * @return 分割后的集合
     */
    public static <T> List<List<T>> split(Long byteSize, List<T> list) {
        if (Objects.isNull(list) || list.isEmpty()) {
            return new ArrayList<>();
        }

        if (byteSize <= BYTE_SIZE) {
            throw new UnsupportedOperationException("参数 byteSize 值不小于 100 bytes！");
        }
        ListSizeSplitUtil.maxByteSize = byteSize;

        if (Boolean.TRUE.equals(isSurpass(Collections.singletonList(list.get(0))))) {
            throw new UnsupportedOperationException("List 中，单个对象都大于 byteSize 的值，分割失败");
        }

        List<List<T>> result = new ArrayList<>();

        List<T> itemList = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            itemList.add(list.get(i));

            if (Boolean.TRUE.equals(isSurpass(itemList))) {
                i = i - 1;
                itemList.remove(itemList.size() - 1);
                result.add(new ArrayList<>(itemList));
                itemList = new ArrayList<>();
            }
        }
        result.add(new ArrayList<>(itemList));
        return result;
    }

    /**
     * isSurpass
     *
     * @param obj 集合
     * @return Boolean
     */
    private static <T> Boolean isSurpass(List<T> obj) {
        // 字节（byte）
        long objSize = RamUsageEstimator.sizeOfAll(obj.toArray());
        return objSize >= ListSizeSplitUtil.maxByteSize;
    }
}
